package vue;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;

import javax.swing.DefaultCellEditor;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;

import modele.Match;

public class PopupMajResultat extends JFrame implements ActionListener {

	private JTable table;
	private JScrollPane scroll;
	private DefaultTableModel model;
	private FenetrePrincipale ihm;
	private JButton valider, annuler;

	public PopupMajResultat(FenetrePrincipale fep) {
		this.ihm = fep;

		setTitle("Mise à jour");
		setLocation(50, 50);
		setSize(400, 300);

		model = new DefaultTableModel() {

			public boolean isCellEditable(int row, int column) {
				return column != 0 && column != 1 && column != 4;
			}
		};

		table = new JTable(model);

		model.addColumn("Date");
		model.addColumn("Equipe 1");
		model.addColumn("  ");
		model.addColumn("  ");
		model.addColumn("Equipe 2");

		table.getColumnModel().getColumn(0).setPreferredWidth(40);
		table.getColumnModel().getColumn(2).setPreferredWidth(5);
		table.getColumnModel().getColumn(3).setPreferredWidth(5);

		SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd");
		String dateMatch = "";
		
		Date dateNow = new Date();
		ArrayList<Match> alMatchs = ihm.getControleur().getMatchsAPronostiquer();
		Collections.sort(alMatchs);
		for (Match match : alMatchs) {
			if(!match.getDate().after(dateNow)) {
				dateMatch = f.format(match.getDate());
				model.addRow(new Object[] { 
						dateMatch,
						match.getEquipe1().getNom(), 
						(match.getScoreEquipe1() == -1)? "" : match.getScoreEquipe1(), 
						(match.getScoreEquipe2() == -1)? "" : match.getScoreEquipe2(),
						match.getEquipe2().getNom() });
			}
		}

		scroll = new JScrollPane(table);
		scroll.setPreferredSize(new Dimension(250, 200));

		this.add(scroll);

		JPanel panelBas = new JPanel(new FlowLayout());

		valider = new JButton("Valider");
		valider.addActionListener(this);

		annuler = new JButton("Quitter");
		annuler.addActionListener(this);

		panelBas.add(valider);
		panelBas.add(annuler);

		this.add(panelBas, BorderLayout.SOUTH);

		this.setVisible(true);
	}

	public DefaultTableModel getTableModel() {
		return model;
	}

	public JTable getTable() {
		return table;
	}

	class ClientsTableButtonRenderer extends JButton implements
			TableCellRenderer {
		public ClientsTableButtonRenderer() {
			setOpaque(false);
			this.setText("Infos");
		}

		public Component getTableCellRendererComponent(JTable table,
				Object value, boolean isSelected, boolean hasFocus, int row,
				int column) {
			setForeground(Color.black);
			setBackground(UIManager.getColor("Button.background"));
			setText("Infos");
			return this;
		}
	}

	public class ClientsTableRenderer extends DefaultCellEditor {
		private JButton button;
		private String label;
		private boolean clicked;
		private int row, col;
		private JTable table;

		public ClientsTableRenderer(JCheckBox checkBox) {
			super(checkBox);
			button = new JButton("Infos");
			button.setText("Infos");
			button.setOpaque(true);
			button.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					fireEditingStopped();
				}
			});
		}

		public Component getTableCellEditorComponent(JTable table,
				Object value, boolean isSelected, int row, int column) {
			this.table = table;
			this.row = row;
			this.col = column;

			button.setForeground(Color.black);
			button.setBackground(UIManager.getColor("Button.background"));
			label = (value == null) ? "" : value.toString();
			button.setText("Infos");
			clicked = true;
			return button;
		}

		public Object getCellEditorValue() {
			if (clicked) {

				JOptionPane.showMessageDialog(button, "RAJOUTER INFOS MATCH "
						+ table.getSelectedRow());
			}
			clicked = false;
			return new String("Infos");
		}

		public boolean stopCellEditing() {
			clicked = false;
			return super.stopCellEditing();
		}

		protected void fireEditingStopped() {
			super.fireEditingStopped();
		}
	}

	public void actionPerformed(ActionEvent e) {
		if(e.getSource() == valider) {
			String valeur1, valeur2;
			boolean saisieCorrect = true;
			for(int i=0; i < model.getRowCount(); i++) {
				valeur1 = model.getValueAt(i,2).toString();
				valeur2 = model.getValueAt(i,3).toString();
				
				//Si un seul des 2 scores est manquant, on l'indique
				if(!valeur1.equals("") && valeur2.equals("") || valeur1.equals("") && !valeur2.equals("")) {
					saisieCorrect = false;
					JOptionPane.showMessageDialog(this, "Une valeur a été oubliée", "Erreur de saisie.", JOptionPane.ERROR_MESSAGE);
				} else if(Integer.parseInt(valeur1) < 0 || Integer.parseInt(valeur2) < 0) {
					saisieCorrect = false;
					JOptionPane.showMessageDialog(this, "Une valeur ne peut pas être négative.", "Erreur de saisie", JOptionPane.ERROR_MESSAGE);
				}//Si les 2 scores sont présentes
				else if(!valeur1.equals("") && !valeur2.equals("")) {
					try{
						Integer.parseInt(valeur1);
						Integer.parseInt(valeur2);
					} catch(NumberFormatException n){
						saisieCorrect = false;
						JOptionPane.showMessageDialog(this, "Une valeur saisie n'est pas un nombre.", "Erreur de saisie", JOptionPane.ERROR_MESSAGE);
					}
				}
				//Dès qu'on détecte une erreur, on arrête tout
				if(!saisieCorrect)
					break;
			}
			//Une fois que la saisie est correcte, on peut sauvegarder
			if(saisieCorrect) {
				int score1, score2;
				//On crée des dates pour pouvoir les comparer plus facilement
				SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd");
				for(int i=0; i < model.getRowCount(); i++) {
					valeur1 = model.getValueAt(i,2).toString();
					valeur2 = model.getValueAt(i,3).toString();
					//Si les 2 scores sont présentes
					if(!valeur1.equals("") && !valeur2.equals("")) {
						Date dateMatch = null;
						try {
							dateMatch = f.parse(model.getValueAt(i,0).toString());
						} catch (ParseException p) { p.printStackTrace(); }
						String nomEquipe1 = model.getValueAt(i,1).toString();
						//On récupère l'obet Match grace à la date et à une équipe
						Match match = ihm.getControleur().getMatchViaInfo(dateMatch, nomEquipe1);
						score1 = Integer.parseInt(model.getValueAt(i,2).toString());
						score2 = Integer.parseInt(model.getValueAt(i,3).toString());
						//Si le score du match est le même que celui à l'écran, c'est qu'il n'a pas été modifié, on ne change donc rien
						if(match.getScoreEquipe1() != score1 || match.getScoreEquipe2() != score2) {
							System.out.println("MAJ match");
							match.setScoreEquipe1(score1);
							match.setScoreEquipe2(score2);
							//On attribut les points aux parieurs pour le match
							ihm.getControleur().calculPtsProno(match);
						}
					}
				}
				ihm.getPanelClassement().majContenu();
				ihm.getControleur().sauvegarderListeMatchsApronostiquer();
				ihm.getControleur().sauvegarderListeUtilisateurs();
				JOptionPane.showMessageDialog(this, "La mise à jour a été effectuée.", "Mise à jour réussie", JOptionPane.INFORMATION_MESSAGE);
			}
		} else if(e.getSource() == annuler)
			this.dispose();
	}
}
